package net.htjs.juc.singleton;

/**
 * 双重检查单例模式
 */
public class  DoubleCheckSingleton {

    private static volatile DoubleCheckSingleton instance;
    private DoubleCheckSingleton() {
        //阻止反射类创建单例
        if (instance != null) {
            throw new IllegalStateException("单例类禁止反射创建实例");
        }
    }

    public static DoubleCheckSingleton getInstance() {
        if (instance == null) {
            //只有首次创建的时候需要访问同步代码块，第二次以后就不需要了
            synchronized (DoubleCheckSingleton.class) {
                //为什么这里又判断了一次，之前不是已经判断过了吗
                /**
                 * 这里防止t1线程创建了instance，这个时候t2线程已经阻塞了，t1线程结束，t2如果不继续判断
                 * 在高并发环境下创建的instance可能不是同一个
                 */
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
